// 引入自定义的'../utils/back'模块，可能包含一些通用的响应或错误处理方法  
const back = require('../utils/back');
// 引入'../controller/token'模块，该模块可能包含与Token相关的操作，如生成、验证等  
const token = require('../controller/token');
// 引入'dayjs'模块，一个轻量级的JavaScript日期库，用于解析、验证、操作和显示日期和时间  【优化时需用到】
const dayjs = require('dayjs');
// 定义一个名为'userAuth'的异步中间件函数，用于用户身份验证  
const userAuth = async (req, res, next) => {
  // 调用token模块的Valid方法验证请求头中的Token 
  const valid = await token.Valid(req.headers.authorization);
  // 如果验证结果中存在错误（err属性为1），则直接发送验证结果并结束请求处理  
  if (valid.err == 1) {
    res.send(valid);
    return;
  }
  // 判断Token类型
  const data = valid.data;
  // 检查Token中的用户类型，如果不是'用户'，则发送错误响应并结束请求处理  
  if (data.user_type != '用户') {
    res.send(back.ERR(back.ERRTYPE.ERROR_TOKEN, '错误的Token'));
    return;
  }
  // 将Token中的数据附加到请求对象上，以便后续处理可以使用这些信息  
  req.userInfo = {
    ...data,
  };
  // const d = req.headers.time ? dayjs(req.headers.time) : dayjs();
  // hBehavior(valid.data, d);
  // 调用next函数，将处理权交给下一个中间件或路由处理函数 
  next();
};
// 定义一个名为'adminAuth'的异步中间件函数，用于管理员身份验证，逻辑与用户身份验证类似  
const adminAuth = async (req, res, next) => {
  // 验证Token
  const valid = await token.Valid(req.headers.authorization);
  if (valid.err == 1) {
    res.send(valid);
    return;
  }
  // 判断Token类型
  const data = valid.data;
  if (data.user_type != '管理员') {
    res.send(back.ERR(back.ERRTYPE.ERROR_TOKEN, '错误的Token'));
    return;
  }
  // 中间件赋值
  req.userInfo = {
    ...data,
  };
  // 调用next函数，将处理权交给下一个中间件或路由处理函数 
  next();
};

// 通用中间件用于通用的身份验证，不区分用户类型  
const baseAuth = async (req, res, next) => {
  // 验证Token 调用token模块的Valid方法验证请求头中的Token  
  const valid = await token.Valid(req.headers.authorization);
   // 如果验证结果中存在错误（err属性为1），则直接发送验证结果并结束请求处理  
  if (valid.err == 1) {
    res.send(valid);
    return;
  }
    // 将Token中的数据附加到请求对象上  
  req.userInfo = {
    ...valid.data,
  };
  // const d = req.headers.time ? dayjs(req.headers.time) : dayjs();
  // hBehavior(valid.data, d);
  // 调用next函数，将处理权交给下一个中间件或路由处理函数 
  next();
};
// 导出定义的中间件函数，以便其他模块可以使用它们  
module.exports = {
  userAuth,
  adminAuth,
  baseAuth,
};
